#pragma once
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/async.h>
#include <chrono>
#include <iostream>

// spdlog 的二次封装

/*
原因:
1. 避免锁冲突, 不使用默认的日志器, 使用全局的日志器
2. 日志输出没有文件名, 行号, 我们需要它
3. 便于使用, 可以输出到 标准输出/文件 的切换
*/ 

namespace wufan_im{
// mode - 运行模式: true-发布模式;  false调试模式
// 如果是调试模式, 则创建标准输出日志器, 输出等级为最低
// 否则是发布模式, 则创建文件输出日志器, 输出等级根据参数而定
std::shared_ptr<spdlog::logger> g_default_logger;
void init_logger(bool mode, const std::string& file, int level)     //要用日志就必须先init设置好再用
{
    if (mode == false) {
        g_default_logger = spdlog::stdout_color_mt("default-logger");
        g_default_logger->set_level(spdlog::level::level_enum::trace);
        g_default_logger->flush_on(spdlog::level::level_enum::trace);
    } else {
        g_default_logger = spdlog::basic_logger_mt("default-logger", file);
        g_default_logger->set_level((spdlog::level::level_enum)level);
        g_default_logger->flush_on((spdlog::level::level_enum)level);
    }
    g_default_logger->set_pattern("[%n][%H:%M:%S][%t][%-8l][%v]");
}
}

// LOG_TRACE("hello world") [__FILE__:__LINE__]hello world
// LOG_TRACE("你好! {}", "小明") [__FILE__:__LINE__]"你好! 小明"
// format字符串为 "你好! {}", "小明"
// g_default_logger->trace函数传参: 参数1:[{}:{}]"你好! {}", "小明"  参数2:__FILE__  参数3:__LINE__  参数4:小明
// 第一个参数是字符串的格式   后面的参数都是要替换的字符
#define LOG_TRACE(format, ...) wufan_im::g_default_logger->trace(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_DEBUG(format, ...) wufan_im::g_default_logger->debug(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_INFO(format, ...) wufan_im::g_default_logger->info(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_WARN(format, ...) wufan_im::g_default_logger->warn(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_ERROR(format, ...) wufan_im::g_default_logger->error(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)
#define LOG_FATAL(format, ...) wufan_im::g_default_logger->critical(std::string("[{}:{}] ") + format, __FILE__, __LINE__, ##__VA_ARGS__)